package com.sdweizan.sdk.bytedance.error;

import lombok.Getter;

import java.util.Arrays;

@Getter
public enum BdErrorEnum {
  ENUM_SUCCESS("0", "成功"),
  ENUM_ERROR("-1", "系统错误"),
  ENUM_N2("-2", "消息限制"),
  ENUM_N3("-3", "参数错误"),
  ENUM_100("100", "请求的 Content-Type 非法"),
  ENUM_1000("1000", "参数格式有误"),
  ENUM_1001("1001", "参数内容有误"),
  ENUM_1008("1008", "通知内容违规"),
  ENUM_1009("1009", "推送消息能力被封禁"),
  ENUM_1010("1010", "发送消息过于频繁"),
  ENUM_2000("2000", "服务内部错误"),
  ENUM_2003("2003", "无有效回调配置"),
  ENUM_2004("2004", "当日金额或笔数超限，请明天再试"),
  ENUM_2008("2008", "签名校验异常，请使用正确的签名和 json 传参"),
  ENUM_2010("2010", "业务参数处理异常"),
  ENUM_2012("2012", "旧平台账户订单不支持分账后退款"),
  ENUM_2013("2013", "服务商无对应小程序分账授权"),
  ENUM_2020("2020", "非法app_id"),
  ENUM_2021("2021", "订单号为空"),
  ENUM_2022("2022", "订单金额必须大于0"),
  ENUM_2023("2023", "商品描述为空"),
  ENUM_2025("2025", "商品详情为空"),
  ENUM_2028("2028", "非法自定义回调地址"),
  ENUM_2033("2033", "结算号为空"),
  ENUM_2038("2038", "小程序违规，小程序被封禁，请咨询相关同学后进行整改"),
  ENUM_2042("2042", "小程序appid无效，请检查app_id字段"),
  ENUM_2045("2045", "请求来源不合法"),
  ENUM_2047("2047", "服务商id无效，请检查thirdparty_id字段"),
  ENUM_2048("2048", "未查询到服务商与小程序的授权关系"),
  ENUM_2101("2101", "平台分账单号与商户原分账单号不能同时为空"),
  ENUM_2102("2102", "退分账单号位数必须在0到64之间"),
  ENUM_2103("2103", "回退金额必须大于0"),
  ENUM_2104("2104", "回退描述长度必须在0到100之间"),
  ENUM_2105("2105", "回退出资方商户号不能为空"),
  ENUM_3000("3000", "业务异常，请检查订单状态"),
  ENUM_3004("3004", "业务繁忙，请稍后使用原单号重试"),
  ENUM_3101("3101", "退款记录不存在"),
  ENUM_3110("3110", "未找到相应支付单"),
  ENUM_3111("3111", "订单状态已经成功"),
  ENUM_3114("3114", "会员未开户"),
  ENUM_3118("3118", "原支付单状态非法，不允许退款"),
  ENUM_3141("3141", "分账后退款，请等待分账全部完成后再试"),
  ENUM_3173("3173", "商户无可用支付方式"),
  ENUM_4001("4001", "退款已失败"),
  ENUM_4003("4003", "退款金额无效"),
  ENUM_4004("4004", "退款金额超限"),
  ENUM_4010("4010", "请求信息不一致"),
  ENUM_4011("4011", "已超过退款期限"),
  ENUM_4039("4039", "退款次数超过限制"),
  ENUM_4100("4100", "风控分账失败导致退款失败"),
  ENUM_4101("4101", "服务商与特约子商户关系上，该产品授权已被解除"),
  ENUM_4102("4102", "商户没有退款权限"),
  ENUM_4103("4103", "原支付交易被冻结"),
  ENUM_4104("4104", "商户担保产品权限已被冻结"),
  ENUM_4105("4105", "退款商家账户余额不足"),
  ENUM_4200("4200", "用户账户有异常行为，已被限制收款，本次交易无法完成"),
  ENUM_4201("4201", "用户账户状态异常或注销，无法原路退款"),
  ENUM_4202("4202", "用户账户状态异常无法退款"),
  ENUM_4401("4401", "回退次数超过限制微信对同一个分账接收方最多能发起20次分账回退请求"),
  ENUM_4402("4402", "未找到相应分账单"),
  ENUM_4403("4403", "分账状态非法，原分账单未到终态，不允许回退"),
  ENUM_4404("4404", "回退金额大于分账金额"),
  ENUM_4405("4405", "退分账出资方不正确，为无效商户号"),
  ENUM_4406("4406", "请求回退金额超出可回退金额"),
  ENUM_4407("4407", "退分账接收方账户状态异常"),
  ENUM_4409("4409", "订单已超过回退期限，微信180天支付宝12个月"),
  ENUM_4410("4410", "退分账接收方账户不存在"),
  ENUM_5001("5001", "订单已支付"),
  ENUM_5002("5002", "订单已超时，请重新下单"),
  ENUM_5004("5004", "小程序违规，支付接口已被封禁，请咨询相关同学后进行整改"),
  ENUM_5005("5005", "交易信息被篡改"),
  ENUM_5007("5007", "无可用支付方式"),
  ENUM_5008("5008", "请求已被拦截，请使用交易系统下单"),
  ENUM_6002("6002", "原支付单未支付成功，禁止分账"),
  ENUM_6003("6003", "微信渠道对外分账比例不允许超过30%，请换金额重试"),
  ENUM_6004("6004", "当前订单仅允许自动结算"),
  ENUM_6006("6006", "其它分账方分账比例超限"),
  ENUM_6007("6007", "存在未完成的退款，禁止分账"),
  ENUM_6008("6008", "请求已被拦截，存在未完成的分账，禁止发起其它分账"),
  ENUM_7007("7007", "账户不存在"),
  ENUM_8000("8000", "提现因风控被拦截"),
  ENUM_8001("8001", "提现余额不足"),
  ENUM_8002("8002", "账户状态异常"),
  ENUM_8003("8003", "账户状态异常已开通自动提现，不支持商户自行发起提现"),
  ENUM_8004("8004", "提现被风控拦截"),
  ENUM_8005("8005", "渠道结算信息不存在"),
  ENUM_40014("40014", "参数为空或非法"),
  ENUM_40015("40015", "appid 错误"),
  ENUM_40017("40017", "secret 错误"),
  ENUM_40018("40018", "code 错误"),
  ENUM_40019("40019", "acode 错误"),
  ENUM_40020("40020", "grant_type 不是 client_credential"),
  ENUM_28001003("28001003", "token失效"),
  ENUM_28001008("28001008", "access_token过期,请刷新或重新授权"),
  ENUM_40003("40003","access_token 不能为空"),
  ENUM_40010("40010","open_id 不能为空"),
  ENUM_40011("40011","open_id 和该小程序没有绑定关系"),
  ENUM_40012("40012","open_id 错误, 请确认是否是在抖音/抖音极速版 app 内生成"),
  ENUM_40022("40022","担保支付订单不存在"),
  ;

  private final String code;
  private final String msg;

  BdErrorEnum(String code, String msg) {
    this.code = code;
    this.msg = msg;
  }

  public static BdErrorEnum findByCode(String code) {
    return Arrays.stream(BdErrorEnum.values())
        .filter(item -> item.getCode().equals(code))
        .findAny()
        .orElse(ENUM_ERROR);
  }
}
